#include "com.h"
#include "qdebug.h"
#include "QByteArray"
#include "qmath.h"
#include "QThread"
#include "QUrl"
#include "QDateTime"
#include "mysql.h"

com::com(test *da,QObject *parent) : QThread(parent)
{
    com_data=da;  
    connect(this,SIGNAL(send_temp(test_temp)),this,SLOT(up_temp(test_temp)));


}

void com::run()
{
     QSerialPort *com_dev = new QSerialPort(); bool isOpen=false;
     com_dev->setPortName("COM1");//预计定义使用串口8com_data->system.system_com
     if(com_dev->isOpen())//如果串口已经打开了 先给他关闭了
     { com_dev->clear();  com_dev->close();}
     if(!com_dev->open(QIODevice::ReadWrite))return;//用ReadWrite 的模式尝试打开串口
     else isOpen=true;
     com_dev->setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);//设置波特率和读写方向
     com_dev->setDataBits(QSerialPort::Data8);		//数据位为8位
     com_dev->setFlowControl(QSerialPort::NoFlowControl);//无流控制
     com_dev->setParity(QSerialPort::NoParity);	//无校验位
     com_dev->setStopBits(QSerialPort::OneStop); //一位停止位

     QVector <double> temp_list;

     while(isOpen)
     {
          if(com_data->writeData.count()>0)
          {
              com_dev->write(com_data->writeData.left(28));
              com_data->writeData.remove(0,28);
          }

           if(com_dev->waitForReadyRead(1000))
           {
               QString readStr=com_dev->readAll();
               readStr.remove(QRegExp("\\s"));//删除所有空

               if(readStr.contains("CB1") && readStr.count()>8)
               {

                   readStr.remove(0,3); bool ok;
                   double val=readStr.toDouble(&ok);  //外筒温度
                   if(ok) com_data->temp_waitong=val;

               }else if(readStr.contains("CPT") && readStr.count()>8)
               {
                   readStr.remove(0,3); bool ok;
                   double buf_tn=readStr.toDouble(&ok);  //内筒温度
                   if(ok)
                   {
                       if(temp_list.count() < 10 )  {temp_list.append(buf_tn);}
                       else
                       {
                           temp_list.remove(0,1);  temp_list.append(buf_tn);

                           QVector <double> val_list;
                           val_list.append(temp_list);

                           std::sort(val_list.begin(),val_list.end());
                           val_list.remove(0,2); val_list.remove(val_list.count()-2,2);

                           //取平均值
                           double sum = std::accumulate(val_list.begin(), val_list.end(), 0.0);
                           double mean= sum/val_list.count();
                           com_data->buf.buf_tn=mean;
                       }
                   }

               }else if(readStr.contains("CW"))
               {
                   com_data->waterIn=  readStr.mid(10,1).toInt();  //注水状态
                   com_data->fire_con= readStr.mid(3,1).toInt();  //点火丝状态
               }
           }

           msleep(50);
     }
}

void com::run_time_out()//处理数据
{

    //恒温10分钟曲线数据
    if(com_data->buf.buf_t.count()<600)
     {
         com_data->buf.buf_i.append(run_timeadd);
         com_data->buf.buf_t.append(com_data->buf.buf_tn);//com_data->buf.buf_tn
     }
     else
     {
         com_data->buf.buf_t.remove(0,1);
         com_data->buf.buf_t.append(com_data->buf.buf_tn);
     }

     auto max = std::max_element(std::begin(com_data->buf.buf_t), std::end(com_data->buf.buf_t));//取容器内最大值
     auto min = std::min_element(std::begin(com_data->buf.buf_t), std::end(com_data->buf.buf_t));//取容器内最小值
     com_data->buf.buf_th=*max;
     com_data->buf.buf_tl=*min;
     com_data->buf.buf_tc=com_data->buf.buf_th-com_data->buf.buf_tl;

     //试验曲线数据
     com_data->buf.buf_ci.append(run_timeadd);
     com_data->buf.buf_ct.append(com_data->buf.buf_tn);

     test_temp da;
     da.test_id=com_data->info.test_id;
     da.test_index=com_data->data.data_index;
     da.test_ti=QString("%1").arg(run_timeadd);
     da.test_tk=QString("%1").arg(com_data->buf.buf_tn);
     da.test_tn=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");

     emit send_temp(da);


    run_timeadd++;
}
void com::up_temp(test_temp data)
{
    mysql::INSERT_test_temp(data);
}

